home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 2 / Gold Medal Software Volume 2 (Gold Medal) (1994).iso / utils / scrldlg.arj / SCRLGRP.CPP < prev    next >
C/C++ Source or Header  |  1993-09-16  |  4KB  |  173 lines

  1. #define Uses_ScrollGroup
  2. // ===================================================================
  3. #define Uses_TGroup
  4. #define Uses_TPoint
  5. #define Uses_TRect
  6. // ===================================================================
  7.  
  8. #define Uses_TScrollBar
  9. #define Uses_TBackground
  10. #define Uses_TEvent
  11. // ===================================================================
  12. #include <tv.h>
  13. #include "Dlg.h"
  14. // ===================================================================
  15.  
  16. ScrollGroup::ScrollGroup(const TRect& bounds, TScrollBar* hsb, TScrollBar* vsb) :
  17.     TGroup(bounds),
  18.     ScrollGroupInit(initBackground),
  19.     hScrollBar(hsb),
  20.     vScrollBar(vsb),
  21.     background(0)
  22. {
  23.     eventMask |= evBroadcast;
  24.     delta.x = delta.y = limit.x = limit.y = 0;
  25.  
  26.     if(bkgdMaker != 0 && (background = bkgdMaker(getExtent())) != 0)
  27.         {
  28.         background->growMode = gfGrowHiX | gfGrowHiY;
  29.         insert(background);
  30.         }
  31. }
  32.  
  33. void ScrollGroup::changeBounds(const TRect& bounds)
  34. {
  35.     lock();
  36.     TGroup::changeBounds(bounds);
  37.     setLimit(limit.x, limit.y);
  38.     unlock();
  39.     drawView();
  40. }
  41.  
  42. static Boolean isView(TView* view, void* args)
  43. {
  44.     return Boolean(view == args);
  45. }
  46.  
  47. void ScrollGroup::handleEvent(TEvent& event)
  48. {
  49.     TGroup::handleEvent(event);
  50.  
  51.     if(event.what == evBroadcast)
  52.         {
  53.         if(event.message.command == cmScrollBarChanged &&
  54.                 (event.message.infoPtr == hScrollBar ||
  55.                     event.message.infoPtr == vScrollBar))
  56.             scrollDraw();
  57.         else if(event.message.command == cmReceivedFocus &&
  58.                 firstThat(isView, event.message.infoPtr) != 0)
  59.             focusSubView((TView*) event.message.infoPtr);
  60.         }
  61. }
  62.  
  63. struct ScrollInfo
  64. {
  65.     TPoint delta;
  66.     TView* ignore;
  67. };
  68.  
  69. static void doScroll(TView* view, void* args)
  70. {
  71.     ScrollInfo* info = (ScrollInfo*) args;
  72.  
  73.     if(view != info->ignore)
  74.         {
  75.         TPoint dest = view->origin + info->delta;
  76.         view->moveTo(dest.x, dest.y);
  77.         }
  78. }
  79.  
  80. void ScrollGroup::scrollDraw()
  81. {
  82.     TPoint  d;
  83.  
  84.     d.x = hScrollBar ? hScrollBar->value : 0;
  85.     d.y = vScrollBar ? vScrollBar->value : 0;
  86.  
  87.     if( d.x != delta.x || d.y != delta.y )
  88.         {
  89.         ScrollInfo info;
  90.  
  91.         info.delta = delta-d;
  92.         info.ignore = background;
  93.         lock();
  94.         forEach(doScroll, &info);
  95.         delta = d;
  96.         unlock();
  97.         drawView();
  98.         }
  99. }
  100.  
  101. void ScrollGroup::scrollTo(int x, int y)
  102. {
  103.     lock();
  104.     if( hScrollBar != 0 && x != hScrollBar->value)
  105.         hScrollBar->setValue(x);
  106.     if( vScrollBar != 0 && y != vScrollBar->value)
  107.         vScrollBar->setValue(y);
  108.     unlock();
  109.     scrollDraw();
  110. }
  111.  
  112. void ScrollGroup::setLimit(int x, int y)
  113. {
  114.     limit.x = x;
  115.     limit.y = y;
  116.     lock();
  117.     if(hScrollBar != 0)
  118.         hScrollBar->setParams(hScrollBar->value, 0, x-size.x, size.x-1, 1);
  119.     if(vScrollBar != 0 )
  120.         vScrollBar->setParams(vScrollBar->value, 0, y-size.y, size.y-1, 1);
  121.     unlock();
  122.     scrollDraw();
  123. }
  124.  
  125. void ScrollGroup::setState(ushort aState, Boolean enable)
  126. {
  127.     TGroup::setState(aState, enable);
  128.     if((aState & (sfActive | sfSelected)) != 0 )
  129.         {
  130.         if(hScrollBar != 0)
  131.             if(enable)
  132.                 hScrollBar->show();
  133.             else
  134.                 hScrollBar->hide();
  135.         if(vScrollBar != 0)
  136.             if(enable)
  137.                 vScrollBar->show();
  138.             else
  139.                 vScrollBar->hide();
  140.         }
  141. }
  142.  
  143. void ScrollGroup::focusSubView(TView* view)
  144. {
  145.     TRect rview = view->getBounds();
  146.  
  147.     TRect r = getExtent();
  148.     r.intersect(rview);
  149.     if(r != rview)
  150.         {
  151.         int dx, dy;
  152.  
  153.         dx = delta.x;
  154.         if(view->origin.x < 0)
  155.             dx = delta.x + view->origin.x;
  156.         else if(view->origin.x + view->size.x > size.x)
  157.             dx = delta.x+view->origin.x+view->size.x-size.x;
  158.  
  159.         dy = delta.y;
  160.         if(view->origin.y < 0)
  161.             dy = delta.y + view->origin.y;
  162.         else if(view->origin.y + view->size.y > size.y)
  163.             dy = delta.y+view->origin.y+view->size.y-size.y;
  164.  
  165.         scrollTo(dx, dy);
  166.         }
  167. }
  168.  
  169. TBackground* ScrollGroup::initBackground(TRect r)
  170. {
  171.     return new TBackground(r, ' ');
  172. }
  173.